library ieee ;
use ieee.std_logic_1164.all ;
use ieee.numeric_std.all ;

-- Unité de multiplication dans l'espace numérique standard (dite MSU)
-- Même caractéristiques que la MMU, mais on DOIT avoir R = N


---------------------

entity Mult_Std_Unit is
generic(
	Z : positive range 1 to 256 ;		-- Nombre de bits du module
	N : positive ;	-- Vecteur de base utilisé
	R : positive ;	-- Plus proche puissance de 2 de N par valeur supérieure => Ici, égal à N 
	log2R : positive;
	k : positive 	-- Constante nécessaire au calcul
) ;
port (
	a : in std_logic_vector(Z-1 downto 0) ;	-- Entrée 1 multiplicateur (domaine de Montgomery)
	b : in std_logic_vector(Z-1 downto 0) ;	-- Entrée 2 multiplicateur (domaine de Montgomery)
	is_active : in std_logic ;		-- La MMU doit-elle fonctionner?
	
	clk : in std_logic ;	-- Signal d'horloge
	reset : in std_logic ;
	
	c : out std_logic_vector(Z-1 downto 0) ;	-- Sortie du multiplicateur (domaine de Montgomery)
	is_ready : out std_logic ;		-- La MMU est-elle prête à fonctionner?
	is_end : out std_logic			-- La MMU a-t-elle fini?
 ) ;
end entity ;


--------------------

architecture MSU_V1 of Mult_Std_Unit is

	signal sig_A : unsigned(Z-1 downto 0)  ;	-- Trucs à caster
	signal sig_B : unsigned(Z-1 downto 0) ;

	
	signal sig_C_int1 : unsigned(2*Z-1 downto 0) ;
      	signal sig_C_int2 : unsigned(log2R downto 0) ;
begin
	
	is_ready <= '1' ;
	is_end <= '1' ;
	
	sig_A <= unsigned(a) ;
	sig_B <= unsigned(b) ;
	
	sig_C_int1 <= sig_A * sig_B ;
        sig_C_int2 <= sig_C_int1(log2R downto 0) ;
	
        c <= std_logic_vector( resize(sig_C_int2,Z));
	
end MSU_V1 ;
